﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Unijovem.Domain;
using Unijovem.Domain.Utils;
using Unijovem.UI.Models;
using Webdiyer.WebControls.Mvc;

namespace Unijovem.UI.Controllers
{
    public class ComentarioController : ControllerBase<ComentarioModel, Comentario>
    {
        public ActionResult Comentar(int idExterno, ComentarioModel.TipoComentario tipo)
        {
            return PartialView(new ComentarioModel { IdExterno = idExterno, Tipo = tipo, UsuarioEstaLogado = UsuarioLogado, PessoaLogada = PessoaLogadaModel});
        }

        public ActionResult ListarComentarios(int id, int page = 1)
        {
            var comentarios = WebSession<List<ComentarioModel>>(string.Concat(SessionName.Comentarios, id));

            //foreach (var comentario in comentarios.Where(comentario => PessoaLogada != null))
            //    comentario.UsuarioEstaLogado = comentario.IdPessoa == PessoaLogada.Id;

            var pagedComentarios = new PagedList<ComentarioModel>(comentarios, page, 10);
            ViewBag.IdExterno = id;

            return Request.IsAjaxRequest()
                       ? PartialView("PagedListarComentarios", pagedComentarios)
                       : PartialView(pagedComentarios);
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Comentar(int idExterno, ComentarioModel.TipoComentario tipo, string comentario)
        {
            var model = new ComentarioModel
                            {
                                Descricao = comentario.Replace("&lt;", "<").Replace("&gt;", ">"),
                                Ativo = true,
                                Data = DateTime.Now,
                                IdPessoa = PessoaLogada.Id
                            };

            model = new ComentarioModel().CriarViewModel(Salvar(model, tipo, idExterno));

            return PartialView("Comentario", model);
        }

        private Comentario Salvar(ComentarioModel model, ComentarioModel.TipoComentario tipo, int idExterno)
        {
            var comentarioDominio = model.CriarDominio();
            var nomeDominio = tipo.GetDescription();
            var dominioExterno = (GeneralAction)Activator.CreateInstance("Unijovem.Domain", string.Concat("Unijovem.Domain.", nomeDominio, "Comentario")).Unwrap();
            dominioExterno.GetType().GetProperty("Comentario").SetValue(dominioExterno, comentarioDominio, null);
            dominioExterno.GetType().GetProperty(string.Concat("Id", nomeDominio)).SetValue(dominioExterno, idExterno, null);

            dominioExterno.Save(dominioExterno);
            return (Comentario)dominioExterno.GetType().GetProperty("Comentario").GetValue(dominioExterno, null);
        }
    }
}
